package com.curricula.curriculum.action;

import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import com.curricula.curriculum.form.EmailForm;
import com.curricula.curriculum.service.EmailService;
import com.curricula.curriculum.vo.EmailVO;
import com.curricula.mensaje.vo.MsgVO;
import com.curricula.usuario.vo.UsuarioVO;

/**
 * DispatchAction que controla las altas bajas y cambios en la tabla de EMAIL.
 * 
 * @author Hugo
 * @version 1.0
 * 
 */
public class EmailAction extends DispatchAction {
	MsgVO msg = new MsgVO();
	ActionForward forward = null;
	static Logger log = Logger.getLogger(EmailAction.class);
	
	/**
	 * Actualiza el orden de cada unos de los registros dependiendo del arreglo tableEmail[]
	 * que llega como parametro, para definir la prioridad de los registros que se mostraran
	 * en las peticiones de generar curriculum PDF.
	 * 
	 * @author Hugo
	 * @param ActionMapping mapping
	 * @param ActionForm form
	 * @param HttpServletRequest request
	 * @param HttpServletResponse response
	 * @return mapping.findForward forward
	 * @throws InvocationTargetException 
	 * @throws IllegalAccessException 
	 */
	public ActionForward ordenar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ) throws IllegalAccessException, InvocationTargetException{
		String []table = request.getParameterValues("tableEmail[]");
		UsuarioVO userSesion = (UsuarioVO) request.getSession().getAttribute("usuarioVO");
		try {
			if(userSesion!=null){
				EmailService.ordenar(table, userSesion);
				forward = mapping.findForward("ordenCorrecto");
			}else{
				msg.setMsgTipo("registro");
				msg.setMsgTitulo("Usuario no Registrado");
				msg.setMsgDescripcion("Debe iniciar sesion para poder modificar su informaci�n, por favor escriba un usuario y contrase�a o registre una cuenta.");				
				request.setAttribute("msgVO", msg);
				forward = mapping.findForward("error");
			}
		} catch (SQLException e) {
			MsgVO msgbd = new MsgVO("bd", e);
			request.setAttribute("msgVO", msgbd);				
			forward = mapping.findForward("error");
		} catch (Exception e) {
			MsgVO msgerror = new MsgVO("error", e);
			request.setAttribute("msgVO", msgerror);				
			forward = mapping.findForward("error");
		}
		return forward;		
	}
	
	/**
	 * Inserta registros en la tabla curricula.email del usuario que esta actualmente en sesion.
	 * 
	 * @author Hugo
	 * @param ActionMapping mapping
	 * @param ActionForm form
	 * @param HttpServletRequest request
	 * @param HttpServletResponse response
	 * @return mapping.findForward forward
	 * @throws InvocationTargetException 
	 * @throws IllegalAccessException 
	 */
	public ActionForward setInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ) throws IllegalAccessException, InvocationTargetException{
		EmailForm emailForm = (EmailForm) form;
		EmailVO email = new EmailVO();
		BeanUtils.copyProperties(email, emailForm);
		try {		
			UsuarioVO userSesion = (UsuarioVO) request.getSession().getAttribute("usuarioVO");
			if(userSesion!=null){
				email.setIdUser(userSesion.getUsrId());
				if(EmailService.llenar(email)){
					msg.setMsgTipo("informacion");
					msg.setMsgTitulo("Informaci�n de actualizaci�n");
					msg.setMsgDescripcion("Los datos se insertaron correctamente.");
					request.setAttribute("msgVO", msg);
					form.reset(mapping, request);
					forward = mapping.findForward("formulario");
				}else{
					msg.setMsgTipo("informacion");
					msg.setMsgTitulo("Informaci�n de actualizacion");
					msg.setMsgDescripcion("Ocurrio un error al actualizar la informaci�n.");
					request.setAttribute("msgVO", msg);
					forward = mapping.findForward("formulario");
				}				
			}else{
				msg.setMsgTipo("registro");
				msg.setMsgTitulo("Usuario no Registrado");
				msg.setMsgDescripcion("Debe iniciar sesion para poder modificar su informaci�n, por favor escriba un usuario y contrase�a o registre una cuenta.");				
				request.setAttribute("msgVO", msg);
				forward = mapping.findForward("inicio");
			}
		} catch (SQLException e) {
			MsgVO msgbd = new MsgVO("bd", e);
			request.setAttribute("msgVO", msgbd);				
			forward = mapping.findForward("formulario");
		} catch (Exception e) {
			MsgVO msgerror = new MsgVO("error", e);
			request.setAttribute("msgVO", msgerror);				
			forward = mapping.findForward("formulario");
		}
		return forward;
	}
	
	/**
	 * Obtiene los registros de la tabla curricula.email del usuario que esta actualmente en sesion,
	 * utilizando como filtro el formulario que viene del JSP
	 * 
	 * @author Hugo
	 * @param ActionMapping mapping
	 * @param ActionForm form
	 * @param HttpServletRequest request
	 * @param HttpServletResponse response
	 * @return mapping.findForward forward
	 * @throws InvocationTargetException 
	 * @throws IllegalAccessException 
	 */
	public ActionForward getInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ) throws IllegalAccessException, InvocationTargetException{
		EmailForm emailForm = (EmailForm) form;
		EmailVO email = new EmailVO();
		BeanUtils.copyProperties(email, emailForm);
		List<EmailVO> emails = new ArrayList<EmailVO>();
		UsuarioVO userSesion = (UsuarioVO) request.getSession().getAttribute("usuarioVO");
		try {
			if(userSesion!=null){
				email.setIdUser(userSesion.getUsrId());
				HttpSession sesion = request.getSession();
				emails = EmailService.obtener(email);
				sesion.setAttribute("emailsList", emails);
				forward = mapping.findForward("table");					
			}else{
				msg.setMsgTipo("registro");
				msg.setMsgTitulo("Usuario no Registrado");
				msg.setMsgDescripcion("Debe iniciar sesion para poder modificar su informaci�n, por favor escriba un usuario y contrase�a o registre una cuenta.");				
				request.setAttribute("msgVO", msg);
				forward = mapping.findForward("error");
			}
		} catch (SQLException e) {
			MsgVO msgbd = new MsgVO("bd", e);
			request.setAttribute("msgVO", msgbd);				
			forward = mapping.findForward("error");
		} catch (Exception e) {
			MsgVO msgerror = new MsgVO("error", e);
			request.setAttribute("msgVO", msgerror);				
			forward = mapping.findForward("error");
		}
		return forward;		
	}	
	
	/**
	 * Actualiza la visibilidad de cada unos de los registros
	 * para definir la visibilidad de los registros que se mostraran
	 * en las peticiones de generar curriculum PDF.
	 * 
	 * @author Hugo
	 * @param ActionMapping mapping
	 * @param ActionForm form
	 * @param HttpServletRequest request
	 * @param HttpServletResponse response
	 * @return mapping.findForward forward
	 * @throws InvocationTargetException 
	 * @throws IllegalAccessException 
	 */
	public ActionForward visible(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ) throws IllegalAccessException, InvocationTargetException{
		String id = request.getParameter("id");
		UsuarioVO userSesion = (UsuarioVO) request.getSession().getAttribute("usuarioVO");
		try {
			if(userSesion!=null){
				EmailService.visible(id, userSesion);
				forward = mapping.findForward("ordenCorrecto");
			}else{
				msg.setMsgTipo("registro");
				msg.setMsgTitulo("Usuario no Registrado");
				msg.setMsgDescripcion("Debe iniciar sesion para poder modificar su informaci�n, por favor escriba un usuario y contrase�a o registre una cuenta.");				
				request.setAttribute("msgVO", msg);
				forward = mapping.findForward("error");
			}
		}  catch (Exception e) {
			MsgVO msgerror = new MsgVO("error", e);
			request.setAttribute("msgVO", msgerror);				
			forward = mapping.findForward("error");
		}
		return forward;		
	}
	
	/**
	 * Elimina los registros de la tabla curricula.email que esta actualmente en sesion
	 * y que coinciden con el filtro del id de la aficion que se envia por la request
	 * 
	 * @author Hugo
	 * @param ActionMapping mapping
	 * @param ActionForm form
	 * @param HttpServletRequest request
	 * @param HttpServletResponse response
	 * @return mapping.findForward forward
	 */
	public ActionForward delInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ){
		try {		
			UsuarioVO userSesion = (UsuarioVO) request.getSession().getAttribute("usuarioVO");			
			if(userSesion!=null){
				if(EmailService.eliminar(Integer.parseInt(request.getParameter("id")), userSesion.getUsrId())){
					msg.setMsgTipo("informacion");
					msg.setMsgTitulo("Informaci�n de actualizaci�n");
					msg.setMsgDescripcion("Los datos se eliminaron correctamente.");
					request.setAttribute("msgVO", msg);
					forward = mapping.findForward("formulario");
				}else{
					msg.setMsgTipo("informacion");
					msg.setMsgTitulo("Informaci�n de actualizaci�n");
					msg.setMsgDescripcion("Ocurrio un error al eliminar la informaci�n.");
					request.setAttribute("msgVO", msg);
					forward = mapping.findForward("formulario");
				}				
			}else{
				msg.setMsgTipo("registro");
				msg.setMsgTitulo("Usuario no Registrado");
				msg.setMsgDescripcion("Debe iniciar sesion para poder modificar su informaci�n, por favor escriba un usuario y contrase�a o registre una cuenta.");				
				request.setAttribute("msgVO", msg);
				forward = mapping.findForward("inicio");
			}
		} catch (SQLException e) {
			MsgVO msgbd = new MsgVO("bd", e);
			request.setAttribute("msgVO", msgbd);				
			forward = mapping.findForward("formulario");
		} catch (Exception e) {
			MsgVO msgerror = new MsgVO("error", e);
			request.setAttribute("msgVO", msgerror);				
			forward = mapping.findForward("formulario");
		}
		return forward;
	}
}
